来自狗书第七章:大型程序的结构
项目结构
下图显示多文件的Flask程序的基本结构
这个结构有四个顶层目录:
- Flask应用一般放置在名为
app
的目录下 migrations
目录包含数据库迁移脚本- 单元测试放置在
test
目录下 venv
目录包含Python虚拟环境
还有一些新的文件:
requirements.txt
列出一些依赖包,这样就可以很容易的在不同的计算机上部署一个相同的虚拟环境。config.py
存储了一些配置设置。manage.py
用于启动应用程序和其他应用程序任务。
配置选项
在这里配置应用相关的配置,例如Form用到的SECRET_KEY
, 数据库配置的SQLALCHEMY_DATABASE_URI
等配置信息。也可以在这里配置开发、测试和生产环境所需要的不同配置等。
config.py
文件:
1 | import os |
程序包
应用程序包放置了所有应用程序代码、模板(templates)和静态文件(static)。数据库模型和电子邮件支持功能也要置入到这个包中,以app/models.py
和app/email.py
形式存入自己的模块当中
使用工厂函数创建程序实例
单个文件中开发程序,创建程序实例在全局作用域中,无法动态修改配置,对于单元测试来说很重要,必须在不同的配置环境中运行程序。
这里把创建程序实例的过程放到可显示调用的工厂函数中。(app.__init__.py
)
1 | from flask import Flask |
工厂函数返回创建的Flask程序实例。create_app()
函数就是程序的工厂函数,接收一个参数就是程序所使用的配置名。这时候,是动态获得了程序实例了,但是定义路由需要在调用工厂函数之后才能使用app.route
装饰器定义路由。这时候就引入蓝图(Blueprint)来进行路由的定义。
蓝图中实现程序功能
蓝图定义的路由处于休眠状态,直到蓝图注册到应用实例上后,路由才真正成为程序的一部分,蓝图的使用对于大型程序的模块化开发提供了方便。
app/main/__init__.py
1 | from flask import Blueprint |
这里定义蓝图main,程序的路由在views.py中,错误处理程序在errors.py中
在工厂函数create_app()
中将蓝图注册到程序实例上
1 | def create_app(config_name): |
启动脚本
在顶级文件夹中的manage.py文件用于启动应用程序 manage.py
1 | #!/usr/bin/env python |
需求文件
包含一个requirement.txt文件,用于记录所有依赖包以及精准的版本号,pip使用下面命令生成需求文件
1 | (venv) $ pip freeze > requirements.txt |
在一个新环境中,使用下面的命令创建一个相同的环境
1 | (venv) $ pip install -r requirements.txt |